// 管理用户的 token
// 导入操作 cookies 的方法
import {
  getToken,
  setToken,
  delToken
} from '@/utils/auth'
// 导入登录的接口
import {
  loginApi,
  getInfoApi,
  getBaseInfo
} from '@/api/user'
import {
  Message
} from 'element-ui'
const state = {
  // 保存 token
  token: getToken() || '',
  // 定义保存用户信息的对象
  userInfo: {}
}
const mutations = {
  // 给 token 赋值
  setToken(state, payload) {
    // 存在了 vuex 中
    state.token = payload
    // 存在 cookies 中
    setToken(payload)
  },
  // 删除 token
  removeToken(state) {
    // 清除 vuex 中的 token
    state.token = null
    // 清除 cookies 中的 token
    delToken()
  },
  // 给userInfo 赋值
  setUserInfo(state, payload) {
    state.userInfo = payload
  },
  // 删除 userInfo
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
const actions = {
  // 封装一个方法用来完成登录
  async login(ctx, data) {
    try {
      // 调用登录接口
      const res = await loginApi(data)
      // 修改 token 状态
      ctx.commit('setToken', res.data.data)
    } catch (err) {
      Message.error(err.message)
      return Promise.reject(err)
    }
  },
  // 定义一个方法用来从服务器中得到用户信息
  async getUserInfo(ctx) {
    try {
      // 获取用户信息
      const res = await getInfoApi()
      // 获取用户头像
      const avatarInfo = await getBaseInfo(res.data.data.userId)
      // 将用户信息 & 用户头像信息合并起来
      const myInfo = {
        ...res.data.data,
        ...avatarInfo.data.data
      }
      // 将用户信息保存起来
      ctx.commit('setUserInfo', myInfo)
    } catch (error) {
      return Promise.reject(error)
    }
  },
  // 退出登录
  logout({
    commit
  }) {
    // 清除 token
    commit('removeToken')
    // 清除用户信息
    commit('removeUserInfo')
  }
}

// 暴露一个模块对象
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
